001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Nov 30, 2002
005 * Time: 7:49:41 PM
006 */
007
008 package EVolve.visualization.XYViz.ValValViz;
009
010 import EVolve.visualization.*;
011 import EVolve.visualization.Dimension;
012 import EVolve.Scene;
013 import EVolve.util.*;
014 import EVolve.util.equators.*;
015 import EVolve.util.equators.Set;
016 import EVolve.util.painters.RandomPainter;
017 import EVolve.data.*;
018 import javax.swing.*;
019 import java.util.*;
020 import java.awt.event.*;
021 import java.awt.*;
022
023 public class DotplotViz extends ValueValueVisualization {
024 private JTextField textInterval,textMatch, textBegin,textEnd;
025 private DataTrace trace;
026 private long event;
027 private JComboBox comboEquator;
028 private Equator[] equatorList;
029 private float percent;
030 private Equator selectedEquator;
031 private JMenuItem itemSelectX, itemSelectTimeFrame;
032 private static JMenuItem selectionMenu[] = null;
033 private static int SELECT_OPTION = 0x0011;
034 private JLabel toEventNo;
035
036
037 public DotplotViz() {
038 super();
039
040 beginCall = 0;
041 endCall = 300;
042 interval = 10;
043 percent = 100;
044
045
046 equatorList = new Equator[2];
047 equatorList[0] = new OrderedEquator();
048 equatorList[1] = new UnorderedEquator();
049 selectedEquator = null;
050 }
051
052 public Dimension[] createDimension() {
053 Dimension [] returnDimension = new Dimension[2];
054
055 xAxis = new ValueDimension();
056 entityIdFilter = new ReferenceDimension();
057
058 returnDimension[0] = xAxis;
059 returnDimension[1] = entityIdFilter;
060
061 return returnDimension;
062 }
063
064 public void autoUpdateConfiguration(HashMap config) {
065 super.autoUpdateConfiguration(config);
066 if (config.get("Match")!=null) {
067 percent = ((Float)(config.get("Match"))).floatValue();
068 }
069 if (config.get("Options")!=null) {
070 String equatorName = (String)config.get("Options");
071 for (int i=0; i<equatorList.length; i++)
072 if (equatorList[i].getName().equals(equatorName)) {
073 selectedEquator = equatorList[i];
074 comboEquator.setSelectedIndex(i);
075 break;
076 }
077 }
078 textInterval.setText(String.valueOf(interval));
079 textMatch.setText(String.valueOf(percent));
080 textBegin.setText(String.valueOf(beginCall));
081 textEnd.setText(String.valueOf(endCall));
082 }
083
084 protected void updateConfiguration() {
085
086 selectedEquator = equatorList[comboEquator.getSelectedIndex()];
087
088 try {
089 if (autoInterval != -1) {
090 interval = autoInterval;
091 autoInterval = -1;
092 } else {
093 interval = Integer.parseInt(textInterval.getText());
094 percent = Float.parseFloat(textMatch.getText());
095 if ((percent>100)||(percent < 0)) {
096 Scene.showErrorMessage("Match percent must be between 0 and 100.");
097 configure();
098 }
099 textInterval.setText(String.valueOf(interval));
100 textMatch.setText(String.valueOf(percent));
101 }
102
103 beginCall = Integer.parseInt(textBegin.getText());
104 endCall = Integer.parseInt(textEnd.getText());
105 selectedEquator.setInterval(interval);
106 selectedEquator.setMatch(percent);
107
108 canvas.setName(entityIdFilter.getName(), entityIdFilter.getName());
109 super.updateConfiguration();
110 } catch (NumberFormatException e) {
111 Scene.showErrorMessage("Interval, begin call and end call must be an integer and smaller than "+Integer.MAX_VALUE+".");
112 configure();
113 };
114
115 }
116
117 public HashMap getCurrentConfigure() {
118 HashMap configure = super.getCurrentConfigure();
119
120 configure.put("Interval", new Integer(interval));
121 configure.put("BeginCall", new Long(beginCall));
122 configure.put("EndCall", new Long(endCall));
123 configure.put("Match", new Float(percent));
124 configure.put("Options", selectedEquator.getName());
125
126 return configure;
127 }
128
129 public void preVisualize() {
130 image = new AutoImage();
131 trace = selectedEquator.initialDataTrace(interval, Scene.getDataManager().getEntity()[entityIdFilter.getDataFilter().getTargetType()].size());
132 event = 0;
133 getSelection();
134 installPainter();
135 super.preVisualize();
136 }
137
138 protected void receiveElement(Element element) {
139 if (element.isOptional()) return;
140
141 long traceId = entityIdFilter.getField(element);
142 long no = xAxis.getField(element) - 1;
143
144 countEvents(no);
145 if ((no < beginCall)||(no > endCall)) {
146 return;
147 }
148
149 event++;
150 trace.updateTrace(traceId);
151
152 ArrayList data = trace.getTrace();
153
154 if ((event%interval == 0)||(event-endCall==1)) {
155 int size = data.size() - 1;
156 for (int i=size+1; i>1; i--) {
157 Set set1 = (Set)data.get(size);
158 Set set2 = (Set)data.get(i-2);
159 if (selectedEquator.isEqual(set1,set2)) {
160 painter.paint(image,i-2,size,set1.getHashValue());
161 painter.paint(image,size,i-2,set1.getHashValue());
162 }
163 }
164 if (size>=0) {
165 painter.paint(image,size,size,((Set)data.get(size)).getHashValue());
166 image.setColor(size,size,Color.black);
167 }
168 }
169 }
170
171 public void visualize() {
172 canvas.setName("Time - " + xAxis.getDataFilter().getName() + " (" + event +" events)", "Time - " + xAxis.getDataFilter().getName() + " (" + event + " events)");
173 sort();
174 }
175
176 protected void mouseMove(int x,int y) {
177 if (interval > 1) return;
178
179 int X = canvas.getImageX(x);
180 int Y = canvas.getImageY(y);
181 int index = X < Y ? X : Y;
182 if ((index >= 0) && (trace!=null) && (index < trace.size())) {
183 int mappedId = (int)((Set)trace.getTrace().get(index)).getElement(0);
184 Entity entity = entityIdFilter.getEntityFromInt(mappedId);
185 if (shift_pressed && (image.getSortedColor(null,null,X,Y)==null))
186 Scene.setStatus(" ");
187 else
188 Scene.setStatus(entity.getName());
189 } else {
190 Scene.setStatus(" ");
191 }
192 }
193
194 public void makeSelection() {
195 ArrayList idList = new ArrayList();
196
197 int x1 = canvas.getStartX();
198 int x2 = canvas.getEndX();
199
200 if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId()) {
201 Scene.showErrorMessage("The active data source used currently is different from \n" +
202 "this visualization, please choose \"" +
203 Scene.getDataSourceManager().getUsedDataSourceName(dataSourceId)+"\".");
204 return;
205 }
206
207 if (((x1<0)&&(x2<0)) || ((x1>=trace.getTrace().size())&&(x2>=trace.getTrace().size())))
208 return;
209
210 if (x1 < 0) x1 = 0;
211 if (x2 >= trace.getTrace().size()) x2 = trace.getTrace().size()-1;
212
213 Set unionSet = ((Set)(trace.getTrace().get(x1)));
214 for (int i=x1+1; i<=x2; i++) {
215 Set next = ((Set)(trace.getTrace().get(i)));
216 unionSet = unionSet.union(next);
217 }
218
219 for (int i=0; i<unionSet.size(); i++) {
220 if (unionSet.getEntityId(i)!=-1)
221 idList.add(new Long(unionSet.getEntityId(i)));
222 }
223
224 int selection[] = null;
225 if ((SELECT_OPTION & 0x00f0) == SELECT_OCCURRED_ENTITIES) {
226 selection = new int[idList.size()];
227 for (int i=0; i<selection.length; i++)
228 selection[i] = ((Long)idList.get(i)).intValue();
229 } else {
230 selection = new int[entityIdFilter.getEntityNumber()];
231 for (int i=0; i<selection.length; i++)
232 selection[i] = i;
233 }
234
235
236 long start = ((long[])timeMap.get(((int)(x1+beginCall/interval))))[1];
237 long end;
238 if (x1==x2) {
239 if (x1+1>trace.getTrace().size()-1)
240 end = Long.MAX_VALUE;
241 else {
242 end = ((long[])timeMap.get((int)(x1+1+beginCall/interval)))[1]-1;
243 }
244 } else {
245 end = ((long[])timeMap.get(((int)(x2+beginCall/interval))))[1];
246 }
247 if ((SELECT_OPTION & 0x000f) == 0x0000) {
248 start = 0;
249 end = Long.MAX_VALUE;
250 }
251 entityIdFilter.selectComparator(1);
252 entityIdFilter.makeSelection(subjectDefinition.getType(),selection,start,end, timeMap);
253 }
254
255 protected JPanel createConfigurationPanel() {
256 JPanel returnVal = new JPanel(new GridLayout(1, 1, 5, 5));
257 JPanel panelEvent = new JPanel(new GridLayout(2,2));
258 JPanel equatorBox = new JPanel(new GridLayout(1,2));
259
260 Box panelBottom = new Box(BoxLayout.Y_AXIS);
261 returnVal.add(panelBottom);
262
263 textBegin = new JTextField(String.valueOf(beginCall));
264 textEnd = new JTextField(String.valueOf(endCall));
265 panelEvent.add(new JLabel("From Event No:"));
266 panelEvent.add(textBegin);
267
268 toEventNo = new JLabel("To Event No:");
269 panelEvent.add(toEventNo);
270 panelEvent.add(textEnd);
271 panelBottom.add(panelEvent);
272
273 comboEquator = new JComboBox();
274 for (int i=0; i<equatorList.length; i++)
275 comboEquator.addItem(equatorList[i].getName());
276 comboEquator.addActionListener(new ActionListener() {
277 public void actionPerformed(ActionEvent e) {
278 textInterval.setText(String.valueOf(equatorList[comboEquator.getSelectedIndex()].getInterval()));
279 textMatch.setText(String.valueOf(equatorList[comboEquator.getSelectedIndex()].getMatch()));
280 }
281 });
282
283 equatorBox.add(new JLabel("Equator:"));
284 equatorBox.add(comboEquator);
285 panelBottom.add(equatorBox);
286
287 JPanel panelEquator = new JPanel(new GridLayout(2,2));
288
289 textInterval = new JTextField(String.valueOf(interval));
290 textMatch = new JTextField(String.valueOf(percent));
291
292 panelEquator.add(new JLabel("Interval:"));
293 panelEquator.add(textInterval);
294 panelEquator.add(new JLabel("Match:"));
295 panelEquator.add(textMatch);
296
297 panelBottom.add(panelEquator);
298
299 return returnVal;
300 }
301
302 protected void installPainter() {
303 painter = new RandomPainter();
304 }
305
306 public JMenuItem[] createSelectionMenuItem() {
307 if (selectionMenu != null) return selectionMenu;
308
309 itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame");
310 itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T);
311 itemSelectTimeFrame.addActionListener(new ActionListener() {
312 public void actionPerformed(ActionEvent e) {
313 boolean selected = itemSelectTimeFrame.isSelected();
314 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_TIME_FRAME);
315 }
316 });
317 itemSelectTimeFrame.setSelected(true);
318
319 itemSelectX = new JCheckBoxMenuItem("Occurred Entitiies");
320 itemSelectX.setMnemonic(KeyEvent.VK_O);
321 itemSelectX.addActionListener(new ActionListener() {
322 public void actionPerformed(ActionEvent e) {
323 boolean selected = itemSelectX.isSelected();
324 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_OCCURRED_ENTITIES);
325 }
326 });
327 itemSelectX.setSelected(true);
328
329 selectionMenu = new JMenuItem[2];
330 selectionMenu[0] = itemSelectTimeFrame;
331 selectionMenu[1] = itemSelectX;
332
333 return selectionMenu;
334 }
335
336 protected void updateComboSubject() {
337 super.updateComboSubject();
338 String range = String.valueOf(Scene.getDataManager().getDataSource().getNumberOfEvents(elementDefinition[comboSubject.getSelectedIndex()].getName()));
339 toEventNo.setText("To Event No:("+range+")");
340 }
341
342 public Object clone() {
343 DotplotViz o = (DotplotViz)super.clone();
344 o.dimension[0] = o.xAxis;
345 o.dimension[1] = o.entityIdFilter;
346 o.trace = (trace == null) ? null : (DataTrace)trace.clone();
347 o.createDialog();
348 o.createMenu();
349
350 return o;
351 }
352 }